package com.spzx;
/*
死锁
 */
public class Test02 {
    // 定义两个锁对象
    private static final Object LOCK_A = new Object();
    private static final Object LOCK_B = new Object();

//    public static void main(String[] args) {
//        // 线程 1：先拿 LOCK_A，再尝试拿 LOCK_B
//        Thread thread1 = new Thread(() -> {
//            synchronized (LOCK_A) {
//                System.out.println("线程 1 持有 LOCK_A，尝试获取 LOCK_B...");
//                try {
//                    // 模拟业务耗时，让线程 2 有机会拿到 LOCK_B
//                    Thread.sleep(100);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                synchronized (LOCK_B) {
//                    System.out.println("线程 1 成功拿到 LOCK_B");
//                }
//            }
//        });
//
//        // 线程 2：先拿 LOCK_B，再尝试拿 LOCK_A
//        Thread thread2 = new Thread(() -> {
//            synchronized (LOCK_B) {
//                System.out.println("线程 2 持有 LOCK_B，尝试获取 LOCK_A...");
//                try {
//                    // 模拟业务耗时，让线程 1 有机会拿到 LOCK_A
//                    Thread.sleep(100);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                synchronized (LOCK_A) {
//                    System.out.println("线程 2 成功拿到 LOCK_A");
//                }
//            }
//        });
//
//        // 启动线程
//        thread1.start();
//        thread2.start();
//    }
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            synchronized (LOCK_A) {
                System.out.println("拿到Lock_A，准备拿lock_B");
            }
            synchronized (LOCK_B) {
                System.out.println("成功拿到lock_B");
            }

        });
        Thread thread2 = new Thread(() -> {
            synchronized (LOCK_B) {
                System.out.println("拿到Lock_B，准备拿lock_A");
            }
            synchronized (LOCK_A) {
                System.out.println("成功拿到lock_A");
            }

        });
        thread1.start();
        thread2.start();
    }
}
